package com.demo.springdatajpademo.repositroy;

import com.demo.springdatajpademo.entity.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import javax.transaction.Transactional;
import java.util.List;

public interface PersonRepository extends JpaRepository<Person, String> {
    //1. 查询年龄小于等于20岁的人
    List<Person> findAllByPageIsLessThanEqual(Integer age);

    //2. 查询年龄在20-22岁之间，并且性别是男的人
    List<Person> findAllByPageBetweenAndPsexEquals(Integer lowage, Integer heightage, String sex);

    //3. 查询出已婚并且性别是男的人
    List<Person> findAllByGetmarriedIsTrueAndPsexEquals(String sex);

    //4.根据pname来模糊删除 HQL 表名写成类名
    @Query(value = "delete from Person where pname like :name") //:name(和@Param搭配使用) == ?1
    //如果确定是模式查询可以加上 %:name%
    @Modifying
    @Transactional
    void deleteByName(@Param("name") String name);

    //5 使用HQL 查询年龄在20-22岁之间，并且性别是女的人
    //nativeQuery = true 表示是一个SQL 否则就是一个HQL
//    @Query(value = "select * from person where page between 20 and 22 and psex='女'", nativeQuery = true)
    //HQL
    @Query(value = "select p from Person p where p.page between 20 and 22 and p.psex='女'")
    List<Person> findPerson();

    //6. 使用SPEL表达式
    @Modifying
    @Transactional
    @Query(value = "update person set pname=:#{#person.pname},psex=:#{#person.psex},page=:#{#person.page} where pid=:#{#person.pid}", nativeQuery = true)
    void updatePerson(@Param("person") Person person);
}
